package client.profesor;

import static client.common.libs.JQuery.$;
import static org.stjs.javascript.JSCollections.$array;

import org.stjs.javascript.Array;
import org.stjs.javascript.Map;

import client.common.EndPoints.ProfesorEP;
import client.common.Models;
import client.common.Models.Indicador;
import client.common.angular.EmptyPromise;
import client.common.angular.NgScope;
import client.common.directives.EPChanging;
import client.common.directives.EPLoading;
import client.common.javascript.JsProcedure0;
import client.common.javascript.JsProcedure1;

public class IndicadoresMateriaScope extends NgScope {
	@SuppressWarnings("unused")
	private Array<String> categorias;
	private Array<Indicador> indicadores;
	private ProfesorEP profeEP;
	private Long idMateria;
	private Long idGrado;
	private EPChanging epChanging;
	private EPLoading epLoading;

	public IndicadoresMateriaScope(Map<String, Long> stateParams,
			ProfesorEP profesorEP, EPChanging epChanging, EPLoading epLoading) {
		super("IndicadoresMateriaScope");
		this.epChanging = epChanging;
		this.epLoading = epLoading;
		profeEP = profesorEP;
		idMateria = stateParams.$get("idMateria");
		idGrado = stateParams.$get("idGrado");
		categorias = $array("Fortalezas", "Debilidades", "Recomendaciones");
		indicadores = profesorEP.getIndicadores(stateParams.$get("idMateria"),
				stateParams.$get("idGrado"),
				new JsProcedure1<Array<Indicador>>() {

					@Override
					public void $invoke(Array<Indicador> p) {
						$("#collapseFortalezas").collapse();
					}

				});
	}

	public static Array<String> $inject() {
		return $array("$stateParams", "Profesor", "epChanging", "epLoading");
	}

	public void nuevoIndicador(final String d) {
		final IndicadoresMateriaScope self = this;
		profeEP.newIndicador(idMateria, idGrado, new Indicador() {
			{
				categoria = d;
			}
		}, new JsProcedure1<Models.Indicador>() {

			@Override
			public void $invoke(Indicador p) {
				self.indicadores.push(p);
			}
		});
	}

	public void borrarIndicador(final Indicador i) {
		final IndicadoresMateriaScope self = this;
		profeEP.deleteIndicador(idMateria, idGrado, i.categoria.toString(),
				i.consecutivo, new JsProcedure1<EmptyPromise>() {

					@Override
					public void $invoke(EmptyPromise p) {
						self.indicadores.splice(self.indicadores.indexOf(i), 1);
					}
				});
	}

	public void actualizarIndicador(final Indicador i) {
		// listenTo.$invoke(this, 1300);
		final IndicadoresMateriaScope self = this;
		epChanging.$invoke(this, 1300, new JsProcedure0() {

			@Override
			public void $invoke() {
				self.epLoading.$invoke(self.profeEP.updateIndicador(
						self.idMateria, self.idGrado, i.categoria.toString(),
						i.consecutivo, i), "#divIndicador");

			}
		});

	}
}
